package com.sh.rpc.serializer;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 序列化实现类
 */
public class JdkSerializer implements Serializer {

    /**
     * 序列化  对象 -> 字节数组
     * @param obj
     */
    @Override
    public <T> byte[] serialize(T obj) throws Exception {
        // 创建一个字节数组输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 创建一个对象输出流，将字节数组输出流作为参数传入
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        // 将待序列化的对象写入对象输出流
        objectOutputStream.writeObject(obj);
        // 关闭对象输出流
        objectOutputStream.close();
        // 将字节数组输出流中的数据转换为字节数组并返回
        return outputStream.toByteArray();
    }



    @Override
    public <T> T deserialize(byte[] bytes, Class<T> clazz) throws Exception {
        // 创建一个字节数组输入流
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        // 创建一个对象输入流，将字节数组输入流作为参数传入
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        try {
            // 从对象输入流中读取对象，并转换为指定类型的对象
            return (T) objectInputStream.readObject();
        } catch (ClassNotFoundException e) {
            // 如果找不到类定义，则抛出运行时异常
            throw new RuntimeException(e);
        } finally {
            // 关闭对象输入流
            objectInputStream.close();
        }
    }

}
